<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
</html>
<script>
  // 每一个对象都有一个__proto__我们称他为隐式原型 原型也是对象。
  // Prototype 叫做显示原型。
  // 什么是原型链
  // 当我们去访问对象里面的某一个属性或方法的时候，会去对象的本身去寻找，如果找不到就去原型里面找，如果还没有找到，就继续去原型的原型里面寻找，知道找到 或者 原型为 null 结束，这样一个寻找的机制我们称为 原型链。
  // 原型和原型链就是为了继承的。
  //   let obj = {};
  //   console.log(obj);

  //   function Start(val) {
  //     this.name = val;
  //     this.$sing();
  //   }
  //   Start.prototype.$sing = function () {
  //     console.log("他们唱歌都好听");
  //   };
  //   let obj = new Start("杨宗纬");
  //   let obj1 = new Start("林俊杰");
  //   let obj2 = new Start("张韶涵");

  //   // 构造函数的 原型 Prototype
  //   console.log(obj);
  //   console.log(obj.__proto__ === Start.prototype);
  //   // 为什么要在原型上挂在方法或者属性；
  //   console.log(obj1);
  //   console.log(obj2);

  //   console.log(Array.prototype);

  //   Array.prototype.add = function () {
  //     let sum = 0;
  //     console.log(this);
  //     for (let i = 0; i < this.length; i++) {
  //       sum += this[i];
  //     }
  //     return sum;
  //   };

  //   let arr = new Array(13, 23, 33);
  //   let arr1 = [1, 2, 3];

  //   console.log(arr.add());
  //   console.log(arr1.add());
  //   console.log(sum);
  //   arr.push(56);
  //   console.log(arr);

  function Start(val) {
    this.name = val;
  }
  Start.prototype.eat = function () {
    console.log(this.name + "喜欢吃香蕉");
  };
  let obj = new Start("黑猩猩");

  function Child(val, age) {
    Start.call(this, val);
    // 在使用 call apply bind 继承的时候，只能继承属性，不能继承原型的方法
    // Start.apply(this,[val]);
    // Start.bind(this)(val);
    this.age = age;
  }
  // 可以继承原型的方法
  //   Child.prototype.eat = Start.prototype.eat;
  // 每一个原型对象，都有一个 constructor 属性 指向的是构造函数本身
  //   Child.prototype = Start.prototype;
  Child.prototype = new Start();
  Child.prototype.constructor = Child;

  let obj1 = new Child("小星星", 18);
  console.log(obj1);
  obj1.eat();

  //   let obj2 = { name: "张三" };
  //   let obj3 = { name: "李四", sing: function () {} };
  //   obj2 = obj3;

  let str = "fghjk";
  console.log(str.constructor);
</script>
